<?php
// +---------------------------------------------------------------------
// @ProjectName PHP-API
// @Author      Yi<2404697004@qq.com>   
// @Version     V4.0
// @Date        2019/4/2 15:19
// @Description 应用公共文件
// +---------------------------------------------------------------------

/**
 * 产生指定长度的随机数
 * @param int $len
 * @param string $str
 * @return string
 */
function makeRandom(int $len = 8, string $str = ""): string
{
    switch ($str) {
        case 'num':   $pattern = "0123456789"; break;
        case 'alpha': $pattern = "abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";  break;
        default:      $pattern = "0123456789abcdefghjkmnpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ";  break;
    }
    $str = '';
    $max = strlen($pattern)-1;
    for ($i = 1;$i <= $len; ++ $i){
        $str .= $pattern[mt_rand(0,$max)];
    }
    return $str;
}

/**
 * curl发送post请求
 * @param string $url
 * @param array $data
 * @param array $header
 * @param string $contentType
 * @return string
 */
function curlPost(string $url, array $data, array $header=[], string $contentType=""): string
{
    switch ($contentType) {
        case "html": $header[] = "Content-Type: text/html; charset=utf-8"; break;
        case "json": $header[] = "Content-Type: application/json; charset=utf-8"; break;
        case "form": $header[] = "Content-Type: application/x-www-form-urlencoded; charset=utf-8"; break;
        default    : break;
    }

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);                     //设置请求地址
    curl_setopt($ch, CURLOPT_POST, 1);                 //表示post请求
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);             //设置发送数据
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    //要求结果不直接输出到屏幕
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);              //设置超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //不检查https证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);   //不检查https证书
    $header && curl_setopt($ch, CURLOPT_HTTPHEADER,$header); //设置请求头

    $html = curl_exec($ch);
//    $err  = curl_error($ch);
//    if (false === $html || !empty($err)) {
//        $html = curl_getinfo($ch);
//    }
    curl_close($ch);
    return $html;
}

/**
 * curl发送Get请求
 * @param string $url
 * @param array $data
 * @param array $header
 * @param string $contentType
 * @return string
 */
function curlGet(string $url, array $data=[], array $header=[], string $contentType=""): string
{
    switch ($contentType) {
        case "html": $header[] = "Content-Type: text/html; charset=utf-8"; break;
        case "json": $header[] = "Content-Type: application/json; charset=utf-8"; break;
        case "form": $header[] = "Content-Type: application/x-www-form-urlencoded; charset=utf-8"; break;
        default    : break;
    }
    $data && $url .= "?" . http_build_query($data);
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);                     //设置请求地址
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);    //要求结果不直接输出到屏幕
    curl_setopt($ch, CURLOPT_TIMEOUT, 5);              //设置超时时间
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);   //不检查https证书
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);   //不检查https证书
    $header && curl_setopt($ch, CURLOPT_HTTPHEADER,$header); //设置请求头
    $html = curl_exec($ch);
    curl_close($ch);
    return $html;
}

/**
 * 保存数据到文件
 * @param string $path
 * @param string $data
 * @param string $t
 * @return void
 */
function saveFile(string $path, string $data, string $t="w")
{
    $handle = fopen($path, $t);
    fwrite($handle,$data);
    fclose($handle);
    //'r'	只读方式打开，将文件指针指向文件头。
    //'r+'	读写方式打开，将文件指针指向文件头。
    //'w'	写入方式打开，将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
    //'w+'	读写方式打开，将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
    //'a'	写入方式打开，将文件指针指向文件末尾。如果文件不存在则尝试创建之。
    //'a+'	读写方式打开，将文件指针指向文件末尾。如果文件不存在则尝试创建之。
    //'x'	创建并以写入方式打开，将文件指针指向文件头。如果文件已存在，则 fopen() 调用失败并返回 false。如果文件不存在则尝试创建之。
    //'x+'	创建并以读写方式打开，其他的行为和 'x' 一样。
}

/**
 * 过滤掉emoji表情
 * @param string $str
 * @return string
 */
function filterEmoji(string $str): string
{
    return preg_replace_callback(
        '/./u',
        function (array $match) {
            return strlen($match[0]) >= 4 ? '' : $match[0];
        },
        $str);
}

/**
 * json数据
 * @param array $data
 * @return string
 */
function jsonData(array $data): string
{
    return json_encode($data, JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE);
}

/**
 * 格式化返回数据
 * @param int $code
 * @param string $msg
 * @param $data
 * @return string
 */
function echoJson(int $code, string $msg, $data): string
{
    return jsonData([
        'code' => $code,
        'msg'  => $msg,
        'data' => $data
    ]);
}